// 按需导入 $http 对象
import {
  $http
} from '@escook/request-miniprogram'
import store from '../store/index.js'
// 手动定义token的过期时间，要比服务器端的token有效时间(24小时)要短，咱给的是20个小时
const TimeOut = 20 * 3600
// 请求开始之前做一些事情
$http.beforeRequest =async function(options) {
  // 在当前的基准域名下排除掉/users/wxlogin这个接口地址，其他地址都需要在请求头中携带token
  if (options.url.indexOf('/my/') !== -1) {
    const token = store.state.user.token
    if (token) {
      if (IsCheckTimeOut()) {
        // 过期了
        // 清空token
        await store.dispatch('user/asyncUpdateToken', '')
        uni.$showMsg('登录超时，请重新登录')
        // 重新登录
        uni.switchTab({
          url: '/pages/my/my'
        })
      } else {
        // 携带token
        options.header = {
          "Authorization": token
        }
      }
    }
  }

  uni.showLoading({
    title: '数据加载中...',
  })
}

// 请求完成之后做一些事情
$http.afterRequest = function(res) {
  uni.hideLoading()
}
// 因为我们的接口原因，不管是成功还是失败，http状态码都是200,所以我们只能通过业务状态码去进行判断是否成功，我们需要根据业务状态码手动封装Promise去干预返回值，业务状态码(meta.status)为200的代表有效的请求（ resolve返回），非200的为非有效请求(reject)

/**
 * 网络请求参数
 * @param {string} url 请求的url地址
 * @param {string} method 请求方式
 * @param {Object} submitData 请求参数对象
 */

export function http(url, method, submitData) {
  return new Promise(async (resolve, reject) => {
    const {
      data: {
        meta,
        message
      }
    } = await $http[method](`https://missfresh.kuaijiankj.com/api/public/v1${url}`, submitData)
    if (meta.status === 200) {
      // 成功的请求
      resolve(message)
    } else {
      // 登录token失效的问题(过期问题)
      // 失败的提示
      uni.$showMsg(meta.msg)
      // 失败的请求
      reject(new Error(meta.msg))
    }
  })
}

// 是否超时
// 超时逻辑  (当前时间  - 缓存中的时间) 是否大于 时间差
// 认为设定的过期时间是1小时
function IsCheckTimeOut() {
  const currentTime = Date.now() // 当前时间戳
  const timeStamp = uni.getStorageSync('time') // 缓存时间戳: 登录成功时缓存的时间
  return (currentTime - timeStamp) / 1000 > TimeOut
}